package preparedstatement;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 和Statement一样，PreparedStatement也是用来执行SQL语句的
 * 与创建Statement不同的是，需要根据sql语句创建PreparedStatement
 * 除此之外，还能够通过设置参数，指定相应的值，而不是Statement那样使用字符串拼接
 * # 注意：这里是Java里唯二基1的地方，另一个是查询语句中的ResultSet也是基于1
 * 的
 */
public class Demo {
    /**
     * Statement 需要字符串拼接，可读性和维护性较差
     * PreparedStatement 使用参数设置，可读性好，不易犯错
     */
    @Test
    public void test1() {
        long l = System.currentTimeMillis();
        String sql = "insert into hero(name,hp,damage) values(?,?,?)";
//        String sql = "insert into hero values(null,?,?,?)";
//        String sql = "insert into hero(name ,hp,damage) values(?,?,?)";
        try (
                Connection connection = PreparedStatementUtil.INSTANCE.getConnection();
                //根据sql语句创建PreparedStatement
                PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ) {
            /**
             * PreparedStatement执行10次，只需要1次把SQL语句传输到数据库端
             * 数据库对带？进行预编译
             * 每次执行，只需要传输参数到数据库端
             * 1. 网络传输量比Statement更小
             * 2. 数据库不需要再进行编译，响应更快
             */
            for (int i = 0; i < 1000; i++) {
                //设置参数
                preparedStatement.setString(1, "赏金猎人" + i);
                preparedStatement.setFloat(2, 900.33F);
                preparedStatement.setInt(3, 14);
                //执行
                preparedStatement.execute();
            }
            System.out.println("执行完毕");
            long endTIme = System.currentTimeMillis();
            System.out.println("(endTIme-l) = " + (endTIme - l));//(endTIme-l) = 69417
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test2() {
        long l = System.currentTimeMillis();

//        String sql = "insert into hero values(null,?,?,?)";
//        String sql = "insert into hero(name ,hp,damage) values(?,?,?)";
        try (
                Connection connection = PreparedStatementUtil.INSTANCE.getConnection();
                //根据sql语句创建PreparedStatement
                Statement statement = connection.createStatement()
        ) {


            for (int i = 0; i < 1000; i++) {
                String sql = "insert into hero(name,hp,damage) values('hero" + i + "',12,12)";
                statement.execute(sql);
            }
            System.out.println("执行完毕");
            long endTIme = System.currentTimeMillis();
            System.out.println("(endTIme-l) = " + (endTIme - l));//(endTIme-l) = 153911
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
